import { api as semverRuby } from '.';

describe('modules/versioning/ruby/index', () => {
  it.each`
    a              | b              | expected
    ${'1.0.0'}     | ${'1'}         | ${true}
    ${'1.2.0'}     | ${'1.2'}       | ${true}
    ${'1.2.0'}     | ${'1.2.0'}     | ${true}
    ${'1.0.0.rc1'} | ${'1.0.0.rc1'} | ${true}
    ${'1.2.0'}     | ${'2'}         | ${false}
    ${'1.2.0'}     | ${'1.1'}       | ${false}
    ${'1.2.0'}     | ${'1.2.1'}     | ${false}
    ${'1.0.0.rc1'} | ${'1.0.0.rc2'} | ${false}
  `('equals("$a", "$b") === $expected', ({ a, b, expected }) => {
    expect(semverRuby.equals(a, b)).toBe(expected);
  });

  it.each`
    version            | major | minor   | patch
    ${'1'}             | ${1}  | ${null} | ${null}
    ${'1.2'}           | ${1}  | ${2}    | ${null}
    ${'1.2.0'}         | ${1}  | ${2}    | ${0}
    ${'1.2.0.alpha.4'} | ${1}  | ${2}    | ${0}
  `(
    'getMajor, getMinor, getPatch for "$version"',
    ({ version, major, minor, patch }) => {
      expect(semverRuby.getMajor(version)).toBe(major);
      expect(semverRuby.getMinor(version)).toBe(minor);
      expect(semverRuby.getPatch(version)).toBe(patch);
    },
  );

  it.each`
    version                     | expected
    ${'0'}                      | ${true}
    ${'v0'}                     | ${true}
    ${'v1'}                     | ${true}
    ${'v1.2'}                   | ${true}
    ${'v1.2.3'}                 | ${true}
    ${'1'}                      | ${true}
    ${'1.1'}                    | ${true}
    ${'1.1.2'}                  | ${true}
    ${'1.1.2.3'}                | ${true}
    ${'1.1.2-4'}                | ${true}
    ${'1.1.2.pre.4'}            | ${true}
    ${'v1.1.2.pre.4'}           | ${true}
    ${undefined}                | ${false}
    ${''}                       | ${false}
    ${null}                     | ${false}
    ${'v'}                      | ${false}
    ${'tottally-not-a-version'} | ${false}
  `('isVersion("$version") === $expected', ({ version, expected }) => {
    expect(!!semverRuby.isVersion(version)).toBe(expected);
  });

  it.each`
    a                 | b                 | expected
    ${'2'}            | ${'1'}            | ${true}
    ${'2.2'}          | ${'2.1'}          | ${true}
    ${'2.2.1'}        | ${'2.2.0'}        | ${true}
    ${'3.0.0.rc2'}    | ${'3.0.0.rc1'}    | ${true}
    ${'3.0.0-rc.2'}   | ${'3.0.0-rc.1'}   | ${true}
    ${'3.0.0.rc1'}    | ${'3.0.0.beta'}   | ${true}
    ${'3.0.0-rc.1'}   | ${'3.0.0-beta'}   | ${true}
    ${'3.0.0.beta'}   | ${'3.0.0.alpha'}  | ${true}
    ${'3.0.0-beta'}   | ${'3.0.0-alpha'}  | ${true}
    ${'5.0.1.rc1'}    | ${'5.0.1.beta1'}  | ${true}
    ${'5.0.1-rc.1'}   | ${'5.0.1-beta.1'} | ${true}
    ${'1'}            | ${'2'}            | ${false}
    ${'2.1'}          | ${'2.2'}          | ${false}
    ${'2.2.0'}        | ${'2.2.1'}        | ${false}
    ${'3.0.0.rc1'}    | ${'3.0.0.rc2'}    | ${false}
    ${'3.0.0-rc.1'}   | ${'3.0.0-rc.2'}   | ${false}
    ${'3.0.0.beta'}   | ${'3.0.0.rc1'}    | ${false}
    ${'3.0.0-beta'}   | ${'3.0.0-rc.1'}   | ${false}
    ${'3.0.0.alpha'}  | ${'3.0.0.beta'}   | ${false}
    ${'3.0.0-alpha'}  | ${'3.0.0-beta'}   | ${false}
    ${'5.0.1.beta1'}  | ${'5.0.1.rc1'}    | ${false}
    ${'5.0.1-beta.1'} | ${'5.0.1-rc.1'}   | ${false}
    ${'1'}            | ${'1'}            | ${false}
    ${'2.1'}          | ${'2.1'}          | ${false}
    ${'2.2.0'}        | ${'2.2.0'}        | ${false}
    ${'3.0.0.rc1'}    | ${'3.0.0.rc1'}    | ${false}
    ${'3.0.0-rc.1'}   | ${'3.0.0-rc.1'}   | ${false}
    ${'3.0.0.beta'}   | ${'3.0.0.beta'}   | ${false}
    ${'3.0.0-beta'}   | ${'3.0.0-beta'}   | ${false}
    ${'3.0.0.alpha'}  | ${'3.0.0.alpha'}  | ${false}
    ${'3.0.0-alpha'}  | ${'3.0.0-alpha'}  | ${false}
    ${'5.0.1.beta1'}  | ${'5.0.1.beta1'}  | ${false}
    ${'5.0.1-beta.1'} | ${'5.0.1-beta.1'} | ${false}
  `('isGreaterThan("$a", "$b") === $expected', ({ a, b, expected }) => {
    expect(semverRuby.isGreaterThan(a, b)).toBe(expected);
  });

  it.each`
    version                     | expected
    ${'1'}                      | ${true}
    ${'1.2'}                    | ${true}
    ${'1.2.3'}                  | ${true}
    ${'1.2.0-alpha'}            | ${false}
    ${'1.2.0.alpha'}            | ${false}
    ${'1.2.0.alpha1'}           | ${false}
    ${'1.2.0-alpha.1'}          | ${false}
    ${undefined}                | ${false}
    ${''}                       | ${false}
    ${null}                     | ${false}
    ${'tottally-not-a-version'} | ${false}
  `('isStable("$version") === $expected', ({ version, expected }) => {
    const res = !!semverRuby.isStable(version);
    expect(res).toBe(expected);
  });

  it.each`
    versions                                     | expected
    ${['1.2.3-beta', '2.0.1', '1.3.4', '1.2.3']} | ${['1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']}
  `('$versions -> sortVersions -> $expected', ({ versions, expected }) => {
    expect(versions.sort(semverRuby.sortVersions)).toEqual(expected);
  });

  it.each`
    versions                                                          | range                 | expected
    ${['2.1.5', '2.1.6']}                                             | ${'~> 2.1'}           | ${'2.1.5'}
    ${['2.1.6', '2.1.5']}                                             | ${'~> 2.1.6'}         | ${'2.1.6'}
    ${['4.7.3', '4.7.4', '4.7.5', '4.7.9']}                           | ${'~> 4.7, >= 4.7.4'} | ${'4.7.4'}
    ${['2.5.3', '2.5.4', '2.5.5', '2.5.6']}                           | ${'~>2.5.3'}          | ${'2.5.3'}
    ${['2.1.0', '3.0.0.beta', '2.3', '3.0.0-rc.1', '3.0.0', '3.1.1']} | ${'~> 3.0'}           | ${'3.0.0'}
    ${['1.2.3', '1.2.4']}                                             | ${'>= 3.5.0'}         | ${null}
  `(
    'minSatisfyingVersion($versions, "$range") === "$expected"',
    ({ versions, range, expected }) => {
      expect(semverRuby.minSatisfyingVersion(versions, range)).toBe(expected);
    },
  );

  it.each`
    versions                                                          | range                 | expected
    ${['2.1.5', '2.1.6']}                                             | ${'~> 2.1'}           | ${'2.1.6'}
    ${['2.1.6', '2.1.5']}                                             | ${'~> 2.1.6'}         | ${'2.1.6'}
    ${['4.7.3', '4.7.4', '4.7.5', '4.7.9']}                           | ${'~> 4.7, >= 4.7.4'} | ${'4.7.9'}
    ${['2.5.3', '2.5.4', '2.5.5', '2.5.6']}                           | ${'~>2.5.3'}          | ${'2.5.6'}
    ${['2.1.0', '3.0.0.beta', '2.3', '3.0.0-rc.1', '3.0.0', '3.1.1']} | ${'~> 3.0'}           | ${'3.1.1'}
    ${['1.2.3', '1.2.4']}                                             | ${'>= 3.5.0'}         | ${null}
  `(
    'getSatisfyingVersion($versions, "$range") === "$expected"',
    ({ versions, range, expected }) => {
      expect(semverRuby.getSatisfyingVersion(versions, range)).toBe(expected);
    },
  );

  it.each`
    version    | range                | expected
    ${'1.2'}   | ${'>= 1.2'}          | ${true}
    ${'1.2.3'} | ${'~> 1.2.1'}        | ${true}
    ${'1.2.7'} | ${'1.2.7'}           | ${true}
    ${'1.1.6'} | ${'>= 1.1.5, < 2.0'} | ${true}
    ${'1.2'}   | ${'>= 1.3'}          | ${false}
    ${'1.3.8'} | ${'~> 1.2.1'}        | ${false}
    ${'1.3.9'} | ${'1.3.8'}           | ${false}
    ${'2.0.0'} | ${'>= 1.1.5, < 2.0'} | ${false}
  `(
    'matches("$version", "$range") === "$expected"',
    ({ version, range, expected }) => {
      expect(semverRuby.matches(version, range)).toBe(expected);
    },
  );

  it.each`
    version          | range                  | expected
    ${'1.2.2'}       | ${'< 1.2.2'}           | ${true}
    ${'1.1.4'}       | ${'>= 1.1.5, < 2.0'}   | ${true}
    ${'1.2.0-alpha'} | ${'1.2.0-beta'}        | ${true}
    ${'1.2.2'}       | ${'> 1.2.2, ~> 2.0.0'} | ${true}
    ${'1.2.2'}       | ${'<= 1.2.2'}          | ${false}
    ${'2.0.0'}       | ${'>= 1.1.5, < 2.0'}   | ${false}
    ${'1.2.0-beta'}  | ${'1.2.0-alpha'}       | ${false}
    ${'2.0.0'}       | ${'> 1.2.2, ~> 2.0.0'} | ${false}
    ${'asdf'}        | ${'> 1.2.2, ~> 2.0.0'} | ${false}
    ${null}          | ${'> 1.2.2, ~> 2.0.0'} | ${false}
  `(
    'isLessThanRange("$version", "$range") === "$expected"',
    ({ version, range, expected }) => {
      expect(semverRuby.isLessThanRange?.(version, range)).toBe(expected);
    },
  );

  it.each`
    version                                | expected
    ${'1'}                                 | ${true}
    ${'1.2'}                               | ${true}
    ${'1.2.3'}                             | ${true}
    ${'^1.2.3'}                            | ${false}
    ${'~1.2.3'}                            | ${false}
    ${'1.2.*'}                             | ${false}
    ${'< 3.0, >= 1.0.0 <= 2.0.0'}          | ${false}
    ${'< 3.0, >= 1.0.0 <= 2.0.0, = 5.1.2'} | ${false}
  `('isValid("$version") === $expected', ({ version, expected }) => {
    expect(!!semverRuby.isValid(version)).toBe(expected);
  });

  it.each`
    version               | expected
    ${'1'}                | ${true}
    ${'1.1'}              | ${true}
    ${'1.1.2'}            | ${true}
    ${'1.2.0.alpha1'}     | ${true}
    ${'1.2.0-alpha.1'}    | ${true}
    ${'= 1'}              | ${true}
    ${'!= 1.1'}           | ${true}
    ${'> 1.1.2'}          | ${true}
    ${'< 1.0.0-beta'}     | ${true}
    ${'>= 1.0.0.beta'}    | ${true}
    ${'<= 1.2.0.alpha1'}  | ${true}
    ${'~> 1.2.0-alpha.1'} | ${true}
    ${'>= 3.0.5, < 3.2'}  | ${true}
    ${'+ 1'}              | ${false}
    ${'- 1.1'}            | ${false}
    ${'=== 1.1.2'}        | ${false}
    ${'! 1.0.0-beta'}     | ${false}
    ${'& 1.0.0.beta'}     | ${false}
  `('isValid("$version") === $expected', ({ version, expected }) => {
    expect(!!semverRuby.isValid(version)).toBe(expected);
  });

  it.each`
    version                     | expected
    ${'1'}                      | ${true}
    ${'1.2'}                    | ${true}
    ${'1.2.1'}                  | ${true}
    ${'=1'}                     | ${true}
    ${'=1.2'}                   | ${true}
    ${'=1.2.1'}                 | ${true}
    ${'= 1'}                    | ${true}
    ${'= 1.2'}                  | ${true}
    ${'= 1.2.1'}                | ${true}
    ${'1.2.1.rc1'}              | ${true}
    ${'1.2.1-rc.1'}             | ${true}
    ${'= 1.2.0.alpha'}          | ${true}
    ${'= 1.2.0-alpha'}          | ${true}
    ${'!= 1'}                   | ${false}
    ${'> 1.2'}                  | ${false}
    ${'< 1.2.1'}                | ${false}
    ${'>= 1'}                   | ${false}
    ${'<= 1.2'}                 | ${false}
    ${'~> 1.2.1'}               | ${false}
    ${undefined}                | ${false}
    ${''}                       | ${false}
    ${null}                     | ${false}
    ${'tottally-not-a-version'} | ${false}
  `('isSingleVersion("$version") === $expected', ({ version, expected }) => {
    expect(!!semverRuby.isSingleVersion(version)).toBe(expected);
  });

  it('returns a pinned value', () => {
    expect(semverRuby.getPinnedValue?.('1.2.3')).toBe('1.2.3');
    expect(semverRuby.getPinnedValue?.('v1.2.3')).toBe('1.2.3');
  });

  it.each`
    currentValue             | rangeStrategy        | currentVersion | newVersion   | expected
    ${'1.0.3'}               | ${'pin'}             | ${'1.0.3'}     | ${'1.2.3'}   | ${'1.2.3'}
    ${'v1.0.3'}              | ${'auto'}            | ${'v1.0.3'}    | ${'v1.2.3'}  | ${'v1.2.3'}
    ${"'>= 3.0.5', '< 3.2'"} | ${'replace'}         | ${'3.1.5'}     | ${'3.2.1'}   | ${"'>= 3.0.5', '< 3.3'"}
    ${"'0.0.10'"}            | ${'auto'}            | ${'0.0.10'}    | ${'0.0.11'}  | ${"'0.0.11'"}
    ${"'0.0.10'"}            | ${'replace'}         | ${'0.0.10'}    | ${'0.0.11'}  | ${"'0.0.11'"}
    ${'>= 3.2, < 5.0'}       | ${'bump'}            | ${'4.0.2'}     | ${'6.0.1'}   | ${'>= 6.0.1, < 6.0.2'}
    ${'~> 5.2, >= 5.2.5'}    | ${'bump'}            | ${'5.3.0'}     | ${'6.0.0'}   | ${'~> 6.0'}
    ${'~> 5.2, >= 5.2.5'}    | ${'bump'}            | ${'5.3.0'}     | ${'6.0.1'}   | ${'~> 6.0, >= 6.0.1'}
    ${'~> 5.2.0, >= 5.2.5'}  | ${'bump'}            | ${'5.2.5'}     | ${'5.3.1'}   | ${'~> 5.3.1'}
    ${'4.2.0'}               | ${'bump'}            | ${'4.2.0'}     | ${'4.2.5.1'} | ${'4.2.5.1'}
    ${'4.2.5.1'}             | ${'bump'}            | ${'0.1'}       | ${'4.3.0'}   | ${'4.3.0'}
    ${'~> 1'}                | ${'bump'}            | ${'1.2.0'}     | ${'2.0.3'}   | ${'~> 2, >= 2.0.3'}
    ${"'~> 1'"}              | ${'bump'}            | ${'1.2.0'}     | ${'2.0.3'}   | ${"'~> 2', '>= 2.0.3'"}
    ${'= 5.2.2'}             | ${'bump'}            | ${'5.2.2'}     | ${'5.2.2.1'} | ${'= 5.2.2.1'}
    ${'1.0.3'}               | ${'bump'}            | ${'1.0.3'}     | ${'1.2.3'}   | ${'1.2.3'}
    ${'v1.0.3'}              | ${'bump'}            | ${'1.0.3'}     | ${'1.2.3'}   | ${'v1.2.3'}
    ${'= 1.0.3'}             | ${'bump'}            | ${'1.0.3'}     | ${'1.2.3'}   | ${'= 1.2.3'}
    ${'!= 1.0.3'}            | ${'bump'}            | ${'1.0.0'}     | ${'1.2.3'}   | ${'>= 1.2.3'}
    ${'!= 1.0.3'}            | ${'bump'}            | ${'1.0.0'}     | ${'1.0.2'}   | ${'!= 1.0.3'}
    ${'!= 1.0.3'}            | ${'bump'}            | ${'1.0.0'}     | ${'1.0.3'}   | ${'!= 1.0.3'}
    ${'> 1.0.3'}             | ${'bump'}            | ${'1.0.4'}     | ${'1.2.3'}   | ${'> 1.2.2'}
    ${'> 1.2.3'}             | ${'bump'}            | ${'1.0.0'}     | ${'1.0.3'}   | ${'> 1.0.2'}
    ${'< 1.0.3'}             | ${'bump'}            | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2.3'}             | ${'bump'}            | ${'1.0.0'}     | ${'1.0.3'}   | ${'< 1.2.3'}
    ${'< 1.2.2'}             | ${'bump'}            | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2.3'}             | ${'bump'}            | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2'}               | ${'bump'}            | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.3'}
    ${'< 1'}                 | ${'bump'}            | ${'0.9.0'}     | ${'1.2.3'}   | ${'< 2'}
    ${'< 1.2.3'}             | ${'bump'}            | ${'1.0.0'}     | ${'1.2.2'}   | ${'< 1.2.3'}
    ${'>= 1.0.3'}            | ${'bump'}            | ${'1.0.3'}     | ${'1.2.3'}   | ${'>= 1.2.3'}
    ${'>= 1.0.3'}            | ${'bump'}            | ${'1.0.3'}     | ${'1.0.2'}   | ${'>= 1.0.2'}
    ${'<= 1.0.3'}            | ${'bump'}            | ${'1.0.3'}     | ${'1.2.3'}   | ${'<= 1.2.3'}
    ${'<= 1.0.3'}            | ${'bump'}            | ${'1.0.0'}     | ${'1.0.2'}   | ${'<= 1.0.3'}
    ${'~> 1.0.3'}            | ${'bump'}            | ${'1.0.3'}     | ${'1.2.3'}   | ${'~> 1.2.3'}
    ${'~> 1.0.3'}            | ${'bump'}            | ${'1.0.3'}     | ${'1.0.4'}   | ${'~> 1.0.4'}
    ${'~> 4.7, >= 4.7.4'}    | ${'bump'}            | ${'4.7.5'}     | ${'4.7.9'}   | ${'~> 4.7, >= 4.7.9'}
    ${'~> 4.7, >= 4.7.4'}    | ${'bump'}            | ${'4.7.5'}     | ${'4.8.0'}   | ${'~> 4.8'}
    ${'>= 2.0.0, <= 2.15'}   | ${'bump'}            | ${'2.15.0'}    | ${'2.20.1'}  | ${'>= 2.20.1, <= 2.20.1'}
    ${'~> 5.2.0'}            | ${'bump'}            | ${'5.2.4.1'}   | ${'6.0.2.1'} | ${'~> 6.0.2, >= 6.0.2.1'}
    ${'~> 4.0, < 5'}         | ${'bump'}            | ${'4.7.5'}     | ${'5.0.0'}   | ${'~> 5.0, < 6'}
    ${'~> 4.0, < 5'}         | ${'bump'}            | ${'4.7.5'}     | ${'5.0.1'}   | ${'~> 5.0, >= 5.0.1, < 6'}
    ${'~> 4.0, < 5'}         | ${'bump'}            | ${'4.7.5'}     | ${'5.1.0'}   | ${'~> 5.1, < 6'}
    ${'>= 3.2, < 5.0'}       | ${'replace'}         | ${'4.0.2'}     | ${'6.0.1'}   | ${'>= 3.2, < 6.0.2'}
    ${'~> 5.2, >= 5.2.5'}    | ${'replace'}         | ${'5.3.0'}     | ${'6.0.0'}   | ${'~> 6.0, >= 6.0.0'}
    ${'~> 5.2, >= 5.2.5'}    | ${'replace'}         | ${'5.3.0'}     | ${'6.0.1'}   | ${'~> 6.0, >= 6.0.1'}
    ${'~> 5.2.0, >= 5.2.5'}  | ${'replace'}         | ${'5.2.5'}     | ${'5.3.1'}   | ${'~> 5.3.0, >= 5.3.1'}
    ${'4.2.0'}               | ${'replace'}         | ${'4.2.0'}     | ${'4.2.5.1'} | ${'4.2.5.1'}
    ${'4.2.5.1'}             | ${'replace'}         | ${'0.1'}       | ${'4.3.0'}   | ${'4.3.0'}
    ${'4.2.5.1'}             | ${'replace'}         | ${'0.1'}       | ${'4.2.6'}   | ${'4.2.6'}
    ${'~> 4.2'}              | ${'replace'}         | ${'0.1'}       | ${'4.2.5.1'} | ${'~> 4.2'}
    ${'~> 4.2'}              | ${'replace'}         | ${'4.2.5.2'}   | ${'4.2.5.1'} | ${'~> 4.2'}
    ${'~> 4.2.5'}            | ${'replace'}         | ${'0.1'}       | ${'4.2.5.1'} | ${'~> 4.2.5'}
    ${'~> 4.2.5'}            | ${'replace'}         | ${'0.1'}       | ${'4.3.0.1'} | ${'~> 4.3.0'}
    ${'~> 4.2.5.1'}          | ${'replace'}         | ${'0.1'}       | ${'4.2.6'}   | ${'~> 4.2.6'}
    ${'~> 4.2.5.1'}          | ${'replace'}         | ${'4.2.5.2'}   | ${'4.2.6'}   | ${'~> 4.2.6'}
    ${'~> 1'}                | ${'replace'}         | ${'1.2.0'}     | ${'2.0.3'}   | ${'~> 2'}
    ${'= 5.2.2'}             | ${'replace'}         | ${'5.2.2'}     | ${'5.2.2.1'} | ${'= 5.2.2.1'}
    ${'1.0.3'}               | ${'replace'}         | ${'1.0.3'}     | ${'1.2.3'}   | ${'1.2.3'}
    ${'v1.0.3'}              | ${'replace'}         | ${'1.0.3'}     | ${'1.2.3'}   | ${'v1.2.3'}
    ${'= 1.0.3'}             | ${'replace'}         | ${'1.0.3'}     | ${'1.2.3'}   | ${'= 1.2.3'}
    ${'!= 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'!= 1.0.3'}
    ${'!= 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.0.2'}   | ${'!= 1.0.3'}
    ${'!= 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.0.3'}   | ${'!= 1.0.3'}
    ${'> 1.0.3'}             | ${'replace'}         | ${'1.0.4'}     | ${'1.2.3'}   | ${'> 1.0.3'}
    ${'> 1.2.3'}             | ${'replace'}         | ${'1.0.0'}     | ${'1.0.3'}   | ${'> 1.0.2'}
    ${'< 1.0.3'}             | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2.3'}             | ${'replace'}         | ${'1.0.0'}     | ${'1.0.3'}   | ${'< 1.2.3'}
    ${'< 1.2.2'}             | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2.3'}             | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2'}               | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.3'}
    ${'< 1'}                 | ${'replace'}         | ${'0.9.0'}     | ${'1.2.3'}   | ${'< 2'}
    ${'< 1.2.3'}             | ${'replace'}         | ${'1.0.0'}     | ${'1.2.2'}   | ${'< 1.2.3'}
    ${'>= 1.0.3'}            | ${'replace'}         | ${'1.0.3'}     | ${'1.2.3'}   | ${'>= 1.0.3'}
    ${'>= 1.0.3'}            | ${'replace'}         | ${'1.0.3'}     | ${'1.0.2'}   | ${'>= 1.0.2'}
    ${'<= 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'<= 1.2.3'}
    ${'<= 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.0.2'}   | ${'<= 1.0.3'}
    ${'~> 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'~> 1.2.0'}
    ${'~> 1.0.3'}            | ${'replace'}         | ${'1.0.0'}     | ${'1.0.4'}   | ${'~> 1.0.3'}
    ${'~> 4.7, >= 4.7.4'}    | ${'replace'}         | ${'1.0.0'}     | ${'4.7.9'}   | ${'~> 4.7, >= 4.7.4'}
    ${'~> 4.7, >= 4.7.4'}    | ${'replace'}         | ${'4.7.5'}     | ${'4.8.0'}   | ${'~> 4.7, >= 4.7.4'}
    ${'>= 2.0.0, <= 2.15'}   | ${'replace'}         | ${'2.15.0'}    | ${'2.20.1'}  | ${'>= 2.0.0, <= 2.20.1'}
    ${'~> 5.2.0'}            | ${'replace'}         | ${'5.2.4.1'}   | ${'6.0.2.1'} | ${'~> 6.0.0'}
    ${'~> 4.0, < 5'}         | ${'replace'}         | ${'4.7.5'}     | ${'5.0.0'}   | ${'~> 5.0, < 6'}
    ${'~> 4.0, < 5'}         | ${'replace'}         | ${'4.7.5'}     | ${'5.0.1'}   | ${'~> 5.0, < 6'}
    ${'~> 4.0, < 5'}         | ${'replace'}         | ${'4.7.5'}     | ${'5.1.0'}   | ${'~> 5.0, < 6'}
    ${'>= 3.2, < 5.0'}       | ${'widen'}           | ${'4.0.2'}     | ${'6.0.1'}   | ${'>= 3.2, < 6.0.2'}
    ${'~> 5.2, >= 5.2.5'}    | ${'widen'}           | ${'5.3.0'}     | ${'6.0.0'}   | ${'>= 5.2.5, < 7'}
    ${'~> 5.2, >= 5.2.5'}    | ${'widen'}           | ${'5.3.0'}     | ${'6.0.1'}   | ${'>= 5.2.5, < 7'}
    ${'~> 5.2.0, >= 5.2.5'}  | ${'widen'}           | ${'5.2.5'}     | ${'5.3.1'}   | ${'>= 5.2.5, < 5.4'}
    ${'4.2.0'}               | ${'widen'}           | ${'4.2.0'}     | ${'4.2.5.1'} | ${'4.2.5.1'}
    ${'4.2.5.1'}             | ${'widen'}           | ${'0.1'}       | ${'4.3.0'}   | ${'4.3.0'}
    ${'~> 1'}                | ${'widen'}           | ${'1.2.0'}     | ${'2.0.3'}   | ${'>= 1, < 3'}
    ${'= 5.2.2'}             | ${'widen'}           | ${'5.2.2'}     | ${'5.2.2.1'} | ${'= 5.2.2.1'}
    ${'1.0.3'}               | ${'widen'}           | ${'1.0.3'}     | ${'1.2.3'}   | ${'1.2.3'}
    ${'v1.0.3'}              | ${'widen'}           | ${'1.0.3'}     | ${'1.2.3'}   | ${'v1.2.3'}
    ${'= 1.0.3'}             | ${'widen'}           | ${'1.0.3'}     | ${'1.2.3'}   | ${'= 1.2.3'}
    ${'!= 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'!= 1.0.3'}
    ${'!= 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.0.2'}   | ${'!= 1.0.3'}
    ${'!= 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.0.3'}   | ${'!= 1.0.3'}
    ${'> 1.0.3'}             | ${'widen'}           | ${'1.0.4'}     | ${'1.2.3'}   | ${'> 1.0.3'}
    ${'> 1.2.3'}             | ${'widen'}           | ${'1.0.0'}     | ${'1.0.3'}   | ${'> 1.0.2'}
    ${'< 1.0.3'}             | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2.3'}             | ${'widen'}           | ${'1.0.0'}     | ${'1.0.3'}   | ${'< 1.2.3'}
    ${'< 1.2.2'}             | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2.3'}             | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.2.4'}
    ${'< 1.2'}               | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'< 1.3'}
    ${'< 1'}                 | ${'widen'}           | ${'0.9.0'}     | ${'1.2.3'}   | ${'< 2'}
    ${'< 1.2.3'}             | ${'widen'}           | ${'1.0.0'}     | ${'1.2.2'}   | ${'< 1.2.3'}
    ${'>= 1.0.3'}            | ${'widen'}           | ${'1.0.3'}     | ${'1.2.3'}   | ${'>= 1.0.3'}
    ${'>= 1.0.3'}            | ${'widen'}           | ${'1.0.3'}     | ${'1.0.2'}   | ${'>= 1.0.2'}
    ${'<= 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'<= 1.2.3'}
    ${'<= 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.0.2'}   | ${'<= 1.0.3'}
    ${'~> 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.2.3'}   | ${'>= 1.0.3, < 1.2.4'}
    ${'~> 1.0.3'}            | ${'widen'}           | ${'1.0.0'}     | ${'1.0.4'}   | ${'~> 1.0.3'}
    ${'~> 4.7, >= 4.7.4'}    | ${'widen'}           | ${'1.0.0'}     | ${'4.7.9'}   | ${'~> 4.7, >= 4.7.4'}
    ${'~> 4.7, >= 4.7.4'}    | ${'widen'}           | ${'4.7.5'}     | ${'4.8.0'}   | ${'~> 4.7, >= 4.7.4'}
    ${'>= 2.0.0, <= 2.15'}   | ${'widen'}           | ${'2.15.0'}    | ${'2.20.1'}  | ${'>= 2.0.0, <= 2.20.1'}
    ${'~> 5.2.0'}            | ${'widen'}           | ${'5.2.4.1'}   | ${'6.0.2.1'} | ${'>= 5.2.0, < 6.0.3'}
    ${'~> 4.0, < 5'}         | ${'widen'}           | ${'4.7.5'}     | ${'5.0.0'}   | ${'>= 4.0, < 6, < 6'}
    ${'~> 4.0, < 5'}         | ${'widen'}           | ${'4.7.5'}     | ${'5.0.1'}   | ${'>= 4.0, < 6, < 6'}
    ${'~> 4.0, < 5'}         | ${'widen'}           | ${'4.7.5'}     | ${'5.1.0'}   | ${'>= 4.0, < 6, < 6'}
    ${'< 1.0.3'}             | ${'auto'}            | ${'1.0.3'}     | ${'1.2.4'}   | ${'< 1.2.5'}
    ${'< 1.0.3'}             | ${'replace'}         | ${'1.0.3'}     | ${'1.2.4'}   | ${'< 1.2.5'}
    ${'< 1.0.3'}             | ${'widen'}           | ${'1.0.3'}     | ${'1.2.4'}   | ${'< 1.2.5'}
    ${'< 1.0.3'}             | ${'replace'}         | ${'1.0.3'}     | ${'1.2.4'}   | ${'< 1.2.5'}
    ${'~> 6.0.0'}            | ${'update-lockfile'} | ${'6.0.2'}     | ${'6.0.3'}   | ${'~> 6.0.0'}
    ${'~> 6.0.0'}            | ${'update-lockfile'} | ${'6.0.2'}     | ${'7.0.0'}   | ${'~> 7.0.0'}
    ${'"~> 6.0.0"'}          | ${'update-lockfile'} | ${'6.0.2'}     | ${'7.0.0'}   | ${'"~> 7.0.0"'}
  `(
    'getNewValue("$currentValue", "$rangeStrategy", "$currentVersion", "$newVersion") === "$expected"',
    ({ currentValue, rangeStrategy, currentVersion, newVersion, expected }) => {
      expect(
        semverRuby.getNewValue({
          currentValue,
          rangeStrategy,
          currentVersion,
          newVersion,
        }),
      ).toBe(expected);
    },
  );
});
